//
// Created by Jeffrey Wei on 2022/11/2.
// 业务结果协议,在项目中将业务结果定义为数据结构,遵守该协议,最终的结果会以
// 该结果返回,例如,需要将后台的result字段映射到data字段中去
// 最终内部会使用具体的遵守ApiResponse的类型去解析结果,但是会以ApiResponse的形式返回出去
// 始终不相信后台会返回该有的字段,所以协议属性目前均按可选设计
// 注:code和message默认实现为nil,若需要映射请自行映射,并非所有后台设计都遵从此形式,必要的协议属性仅为data和isSuccess

import Foundation

public protocol NetworkResponse {
    /// 构造函数,请求后内部会使用返回json以及具体ApiTargetType的ApiResponseType类型来生成一个实例
    init?(json: Any)
    /// 返回的message
    var message: String? { get }
    /// 返回码
    var code: Int? { get }
    /// 具体的数据
    var data: Any? { get }
    /// 避免字段不全情况,可考虑考虑返回一个该字段
    var extra: Any? { get }
    /// 业务成功的条件,一般可设置为如code为0才算成功
    var isSuccess: Bool { get }
    /// 提供一个静态解析model函数,以便Single<NetworkResponse>可以调用mapModel
    static func parsingModel<T>(type: T.Type, json: [String: Any]) -> T?
    /// 提供一个静态解析model函数,以便可以调用mapModels
    static func parsingModelArray<T>(type: T.Type, json: [[String: Any]]) -> [T]
}

public extension NetworkResponse {
    var message: String? {
        nil
    }

    var code: Int? {
        nil
    }

    var extra: Any? {
        nil
    }
}
